(*****************************************************************

                        анализ правила:
   <описание переменных>::={<имя  переменной>:<имя типа>;}

******************************************************************)
procedure opis;
Var
kem:integer;
tmp:byte;
BEGIN

 case getkll of

  'D','L','R':begin
               er('Ожидался BEGIN',2);
              end;

          'S':if getnit=1 then begin end
               else
                begin
                 er('Ожидался BEGIN',2);
                end;

     { То,ради чего и написанна эта процедура }

  'I':Begin  {I}

        repeat         { пока не BEGIN }

         settpname;

         nextl;
         if (getkll<>'R') or (getnit<>10)
           then er('Ожидался разделитель `:`',2)
            else
              Begin {type name}
               nextl;
               if (getkll<>'S') then er('Ожидалось имя типа',2)
                else
                  case getnit of
                   3: settpnext('B',1,' ');{byte}
                   4: settpnext('I',2,' ');{integer}
                   5: settpnext('C',1,' ');{char}
                   6:begin  {dim}
                      nextl;
                      if (getkll<>'R') or (getnit<>7)
                       then er('Ожидался разделитель `(`',2)
                        else nextl;

                      if (getkll<>'D') then
                         er('Ожидалась десятичная константа',2)
                          else
                         begin
                          kem:=va+1;
                          nextl;
                         end;

                      if (getkll<>'R') or (getnit<>8)
                       then er('Ожидался разделитель `)`',2)
                        else nextl;

                      if (getkll<>'S') or (getnit<>16)
                       then er('Ожидался OF',2)
                        else nextl;

                      if (getkll<>'S')
                        then
                          er('Ожидалось имя базового типа ',2);

                        case getnit of

                         3:settpnext('DB',kem,' ');     {of byte}
                         4:settpnext('DI',kem*2,' '); {of integer}
                         5:settpnext('DC',kem,' ');   {of char}

                         else er('Ожидалось имя базового типа ',2);
                        end  {case}
                     end;   {dim}

                   7:begin  {file}

                       if (getkll<>'S') or (getnit<>7)
                          then er('Ожидался FILE',2)
                            else nextl;
                       if (getkll<>'S') or (getnit<>16)
                          then er('Ожидался OF',2)
                            else nextl;

                       if (getkll<>'S')
                        then
                          er('Ожидалось имя базового типа ',2);

                        case getnit of

                         3:settpnext('FB',2,'C');   {of byte}
                         4:settpnext('FI',2,'C');   {of integer}
                         5:settpnext('FC',2,'C');   {of char}

                         else er('Ожидалось имя базового типа ',2);
                        end  {case}

                     end;   {file}


                   else
                     er('Ожидалось имя типа',2)

                  end {case}

              End;   {type name}
          nextl;

          if (getkll<>'R') or (getnit<>6) then
             er('Ожидался разделитель `;`',2);

          nextl;

          if (getkll<>'I') and
             ((getkll<>'S') or (getnit<>1))
              then er('Ожидался BEGIN',2);

        until (getkll='S') and (getnit=1);

      End;   {I}

 end; { case }

 {------------------------------------}
 {string constant}

 i:=1;
 while length(tab_str[i])>0 do
  begin

   ts[i].iname:=i;
   ts[i].size:=length(tab_str[i]);
   ts[i].addr:=adp;

   adp:=adp+length(tab_str[i]);
   i:=i+1;

  end; {while}
 {------------------------------------}

   gendatbyte($e9);             {JMP code}
   gendatword(adp-$103);

 {####### ГЕНЕРАЦИЯ ДАННЫХ #########}

   for i:=1 to 81 do
        gendatbyte(printmc[i]); {PRINT CONSTANT}

   for i:=1 to 215 do
        gendatbyte(inputkc[i]); {INPUT CONSTANT}

   for i:=1 to 67 do
        gendatbyte(testbyte[i]); {test range byte}

   for i:=1 to 11 do
        gendatbyte(enter[i]); {** RETURN **}

   for i:=1 to 15 do
        gendatbyte(inpchar[i]); {** enter CHAR **}

   for i:=1 to 53 do
        gendatbyte(testdim[i]); {** test range dim **}

   for i:=1 to 49 do
        gendatbyte(testint[i]); {** test signum integer **}

   for i:=1 to 60 do
        gendatbyte(opentest[i]); {** open/create file test **}

   for i:=1 to 114 do
        gendatbyte(testIO[i]); {** I/O file test **}

   for i:=1 to 3 do
        gendatbyte(0); {** data area **}

   i:=1;
   while tp[i].iname<>0 do
    begin

      for r:=1 to tp[i].size do gendatbyte(0);

     i:=i+1;
    end; {while}

 {** строки **}

 i:=1;
 while length(tab_str[i])>0 do
  begin
   for r:=1 to length(tab_str[i]) do
    begin
     gendatbyte(ord(tab_str[i][r]));
    end;
   i:=i+1;

  end; {while}


 {####################################}
END;
